草庐IT

C++ std::move 混淆

全部标签

c++ - std::thread 在使用参数创建时抛出访问冲突异常?

关闭。这个问题需要debuggingdetails.它目前不接受答案。编辑问题以包含desiredbehavior,aspecificproblemorerror,andtheshortestcodenecessarytoreproducetheproblem.这将有助于其他人回答问题。关闭6年前。Improvethisquestion我正在使用VS2015,在使用std::thread时遇到一个非常奇怪的问题。voidKlass::myfunc(inta,intb){std::cout它在Debug模式下运行良好,但当我转到Release模式时抛出“访问冲突异常”。此外,如果我尝试将

c++ - 一个尾数下标的明显规范不足:对于原始数组和 std::vector。已经果断解决了吗?

它以前曾以各种形式被问过,但由于语言规范在这方面似乎是动态的(或者至少是当一些关于这个问题的SO讨论发生时动态的),它根据任何最新的发展(如果有的话)重新审视这个问题可能是有意义的。因此,问题又是,&和下标的组合是否是获取指向数组的假想尾后元素的指针的有效方法inta[42]={};&a[42];它在C++98中被认为是未定义的。但是现代C++呢?我们已经看到DR#232,但出于某种原因仍处于“起草”状态,并且绝对不在标准文本中(自C++14起)。问题是否仍然悬而未决,还是已通过其他方式解决?有趣的是DR#315似乎公开允许通过空指针调用非静态成员函数p(!)基于“*p在p为空,除非左

c++ - 将 C++11 move 语义应用于绑定(bind)函数

我有一些现有的C++98代码,它们使用boost::function和boost:bind进行异步回调。一些相关的简化代码片段包括:typedefboost::functionWriteHandler;structWriteOperation{WriteOperation(constboost::shared_ptr&device,conststd::string&data,constWriteHandler&handler):m_Device(device),m_Data(data),m_Handler(handler){}private:boost::shared_ptrm_Dev

c++ - 在没有 move 构造函数的情况下返回不可复制对象的解决方法

在我的API中,我有一个返回std::istringstream的函数.std::istringstreamclass是不可复制的,但支持move,因此在符合标准的编译器上返回本地没有问题std::istringstream.但是,在gcc4.9上,有nosupportmovestd::istringstream.有没有我可以使用的解决方法std::istringstream无需从用户的角度更改API?建议的解决方法here,使用unique_ptr将改变API的语义。 最佳答案 如果你不能movestd::istringstrea

c++ - 调用时为 std::function 分配新值

inti=9;struct_variable.f=[i](Tstruct_variable&){do_something_with_capture_variable(i);...struct_variable.f=another_compatible_std_function;//dosomethingelse,butneverusecapturedvariableafterhere...};struct_variable.f(struct_variable);lambda函数被保存为成员struct_variable.f(也是类型std::function),在回调中,struct_

c++ - vector 增长时如何强制执行 move 语义?

我有一个std::vector对象的某个类A。该类非常重要,并且定义了复制构造函数和move构造函数。std::vectormyvec;如果我用A对象填充vector(使用例如myvec.push_back(a)),vector的大小会增加,使用复制构造函数A(constA&)实例化vector中元素的新拷贝。我能否以某种方式强制开始使用类A的move构造函数? 最佳答案 您需要使用noexcept通知C++(特别是std::vector)您的move构造函数和析构函数不会抛出异常。然后move构造函数将在vector增长时被调用。

c++ - 双参数和 move 语义

假设我有以下foo函数:Widgetfoo(Widgetlhs,Widgetrhs){returnlhs.bar(rhs);}然后我想在两边使用相同的参数:Widgetbaz(Widgetw){returnfoo(w,w);}碰巧Widget很大,我想避免复制太多。假设bar就位,我可以执行以下操作:Widgetbaz(Widgetw){returnfoo(std::move(w),w);}这只会制作一份拷贝。但我担心这是不正确的代码,因为参数传递顺序在C++中未指定,我可能会给出一个移出的参数。我改为执行以下操作:Widgetbaz(Widgetw){Widgetw_bis(w);r

c++ - 为什么 std::shared_ptr 提供 operator<<?

std::shared_ptr提供operator它只是写出它的地址。没有operator>>只记录地址,不记录内容。我想知道它在哪些情况下有用。 最佳答案 因为是一个潜在有用的东西在原始指针上执行。这是安全的,原始指针就是这样做的,shared_ptr在某些情况下应该用于替换原始指针。相比之下,>>很少有意义。与原始指针不同,将指针值存储在共享指针中会取得它的所有权。我可以some_stream>>raw_ptr除非我用ptr做些什么没有任何问题;有点奇怪,但没有立即中断。对shared_ptr做同样的事情只有在极其深奥的情况下才

c++ - 不完整类型的 std::unique_ptr 无法编译

我将pimpl-idiom与std::unique_ptr结合使用:classwindow{window(constrectangle&rect);private:classwindow_impl;//definedelsewherestd::unique_ptrimpl_;//won'tcompile};但是,我在的第304行收到关于使用不完整类型的编译错误:Invalidapplicationof'sizeof'toanincompletetype'uixx::window::window_impl'据我所知,std::unique_ptr应该能够与不完整的类型一起使用。这是lib

c++ - 用于 cv::Mat 参数的 OpenCV std::vector

执行这个:std::vectorpts;//contains4elementscv::MatptsMat=((cv::InputArray)pts).getMat();在一台机器上,我得到一个带有2个channel的4-by-1cv::Mat。每个元素代表一个二维点。在另一台机器上,我得到一个2090-by-1cv::Mat,它有2个channel,数据很奇怪。这是错误的,这是一个问题,因为vector只包含4个项目。在两台机器上都使用OpenCV3.1从源代码构建,在Windows10上使用CMake。编辑我开始在另一台机器上遇到类似的问题。在Debug模式下的VisualStudi